import android.app.Application
import com.tencent.mmkv.MMKV

/**
 * MMKV工具类，提供常用的数据存取方法
 */
object MMKVUtil {

    // MMKV实例
    lateinit var mmkv: MMKV
        private set



    /**
     * 初始化MMKV
     */
    fun initMMKV(application: Application) {
        val rootDir = MMKV.initialize(application)
        mmkv = MMKV.defaultMMKV()
    }


    // 存储String类型数据
    fun putString(key: String, value: String) {
        mmkv.encode(key, value)
    }

    // 获取String类型数据
    fun getString(key: String, defaultValue: String = ""): String {
        return mmkv.decodeString(key, defaultValue) ?: defaultValue
    }

    // 存储Int类型数据
    fun putInt(key: String, value: Int) {
        mmkv.encode(key, value)
    }

    // 获取Int类型数据
    fun getInt(key: String, defaultValue: Int = 0): Int {
        return mmkv.decodeInt(key, defaultValue)
    }

    // 存储Boolean类型数据
    fun putBoolean(key: String, value: Boolean) {
        mmkv.encode(key, value)
    }

    // 获取Boolean类型数据
    fun getBoolean(key: String, defaultValue: Boolean = false): Boolean {
        return mmkv.decodeBool(key, defaultValue)
    }

    // 存储Long类型数据
    fun putLong(key: String, value: Long) {
        mmkv.encode(key, value)
    }

    // 获取Long类型数据
    fun getLong(key: String, defaultValue: Long = 0L): Long {
        return mmkv.decodeLong(key, defaultValue)
    }

    // 存储Float类型数据
    fun putFloat(key: String, value: Float) {
        mmkv.encode(key, value)
    }

    // 获取Float类型数据
    fun getFloat(key: String, defaultValue: Float = 0f): Float {
        return mmkv.decodeFloat(key, defaultValue)
    }

    // 存储Double类型数据
    fun putDouble(key: String, value: Double) {
        mmkv.encode(key, value)
    }

    // 获取Double类型数据
    fun getDouble(key: String, defaultValue: Double = 0.0): Double {
        return mmkv.decodeDouble(key, defaultValue)
    }

    // 存储String集合
    fun putStringSet(key: String, value: Set<String>) {
        mmkv.encode(key, value)
    }

    // 获取String集合
    fun getStringSet(key: String, defaultValue: Set<String> = emptySet()): Set<String> {
        return mmkv.decodeStringSet(key, defaultValue) ?: defaultValue
    }

    // 删除指定键的数据
    fun remove(key: String) {
        mmkv.remove(key)
    }

    // 检查是否包含指定键
    fun contains(key: String): Boolean {
        return mmkv.containsKey(key)
    }

    // 清除所有数据
    fun clearAll() {
        mmkv.clearAll()
    }

    // 清除所有数据，但保留指定的键
    fun clearAllButKeys(keys: Set<String>) {
        mmkv.clearAll()
        keys.forEach {
            // 这里只是一个演示，实际使用时需要先保存这些键的值再恢复
        }
    }

}